package cn.edu.hyit.hjq.volunteems.backend.dto.reault;

import lombok.Data;

@Data
public class JsonResult<T> {
    // 预定义的常用结果状态
    public enum JsonResultCode {
        SUCCESS(200, "操作成功"),
        FAIL(400, "操作失败"),
        UNAUTHORIZED(401, "未授权"),
        FORBIDDEN(403, "禁止访问"),
        NOT_FOUND(404, "资源不存在"),
        ERROR(500, "系统错误");

        private final int code;
        private final String defaultMessage;

        JsonResultCode(int code, String defaultMessage) {
            this.code = code;
            this.defaultMessage = defaultMessage;
        }

        public int code() {
            return this.code;
        }

        public String defaultMessage() {
            return this.defaultMessage;
        }
    }

    /**
     * 状态码
     */
    private final int code;

    /**
     * 消息
     */
    private final String message;

    /**
     * 数据
     */
    private final T data;

    /**
     * 私有构造方法
     * @param code 状态码
     * @param message 消息
     * @param data 数据
     */
    private JsonResult(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    // ==========  ==========
    public boolean isSuccess() {
        return this.code == JsonResultCode.SUCCESS.code();
    }

    public String getMsg() {
        return this.message;
    }

    // ========== 预定义状态码的快捷方法 ==========

    public static <T> JsonResult<T> success(T data) {
        return new JsonResult<>(JsonResultCode.SUCCESS.code(), JsonResultCode.SUCCESS.defaultMessage(), data);
    }

    public static <T> JsonResult<T> success() {
        return success(null);
    }

    public static <T> JsonResult<T> fail(String message) {
        return new JsonResult<>(JsonResultCode.FAIL.code(), message, null);
    }

    public static <T> JsonResult<T> error(String message) {
        return new JsonResult<>(JsonResultCode.ERROR.code(), message, null);
    }

    public static <T> JsonResult<T> unauthorized(String message) {
        return new JsonResult<>(JsonResultCode.UNAUTHORIZED.code(), message, null);
    }

    public static <T> JsonResult<T> forbidden(String message) {
        return new JsonResult<>(JsonResultCode.FORBIDDEN.code(), message, null);
    }

    public static <T> JsonResult<T> notFound(String message) {
        return new JsonResult<>(JsonResultCode.NOT_FOUND.code(), message, null);
    }

    // ========== 自定义状态码的方法 ==========

    /**
     * 创建自定义状态码的结果
     * @param code 自定义状态码
     * @param message 消息
     * @param data 数据
     * @return JsonResult
     * @param <T> 数据类型
     */
    public static <T> JsonResult<T> of(int code, String message, T data) {
        return new JsonResult<>(code, message, data);
    }

    /**
     * 创建自定义状态码的结果（无数据）
     * @param code 自定义状态码
     * @param message 消息
     * @return JsonResult
     * @param <T> 数据类型
     */
    public static <T> JsonResult<T> of(int code, String message) {
        return of(code, message, null);
    }

    /**
     * 创建自定义状态码的结果（使用预定义状态的默认消息）
     * @param code 自定义状态码
     * @param data 数据
     * @return JsonResult
     * @param <T> 数据类型
     */
    public static <T> JsonResult<T> of(JsonResultCode code, T data) {
        return new JsonResult<>(code.code(), code.defaultMessage(), data);
    }

    /**
     * 创建自定义状态码的结果（无数据，使用预定义状态的默认消息）
     * @param code 自定义状态码
     * @return JsonResult
     * @param <T> 数据类型
     */
    public static <T> JsonResult<T> of(JsonResultCode code) {
        return of(code, null);
    }
}